/*
 * Copyright (c) 2019. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
 * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
 * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
 * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
 * Vestibulum commodo. Ut rhoncus gravida arcu.
 */

package cn.dyw.ui.component;

import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;

public class CircleButton extends JButton {

    public CircleButton(String label) {
        super(label);
        init();
    }

    public CircleButton(Icon icon) {
        super(icon);
        init();
    }

    private void init() {
        // 这个调用使JButton不画背景，而允许我们画一个圆的背景。
        setContentAreaFilled(false);
        // 不绘制边框
        this.setBorderPainted(false);
        // 不绘制焦点状态
        this.setFocusPainted(false);

        // 这些声明把按钮扩展为一个圆而不是一个椭圆。
        setSize(Math.max(getHeight(), getWidth()));
    }

    public void setSize(int r) {
        // 这些声明把按钮扩展为一个圆而不是一个椭圆。
        Dimension size = getPreferredSize();
        size.width  = r;
        size.height = r;
        this.setPreferredSize(size);
        this.setSize(size);
    }

    // 画圆的背景和标签
    protected void paintComponent(Graphics g) {
        if (getModel().isArmed()) {
            // 你可以选一个高亮的颜色作为圆形按钮类的属性
            g.setColor(Color.lightGray);
        } else {
            g.setColor(getBackground());
        }
        g.fillOval(0, 0, getSize().width - 1, getSize().height - 1);
        // 这个调用会画一个标签和焦点矩形。
        super.paintComponent(g);
    }

    // 用简单的弧画按钮的边界。
    protected void paintBorder(Graphics g) {
        g.setColor(Color.white);
        g.drawOval(0, 0, getSize().width - 1, getSize().height - 1);
    }

    // 侦测点击事件
    Shape shape;

    public boolean contains(int x, int y) {
        // 如果按钮改变大小，产生一个新的形状对象。
        if (shape == null || !shape.getBounds().equals(getBounds())) {
            shape = new Ellipse2D.Float(0, 0, getWidth(), getHeight());
        }
        return shape.contains(x, y);
    }
}
